Introduction

The following slides use data sourced from the Mississippi State Department of Health. Data are synthesized by Johns Hopkins University and are available here: [https://github.com/CSSEGISandData/COVID-19]. Code to reproduce these graphs is maintained here: [https://github.com/hunterwyork/ms_covid_viz]. The code can easily be adopted for any state.

These slides are automatically updated. The most recent date of data is visible in the titles of several slides

Introduction, cont.

All cases are as reported by the MSDH. Cases and case rates do not represent the true number of infected individuals in the state. Rather, they reflect availability of testing, testing usage, and actual infection rates. Better metrics for tracking the progress of the pandemic include death rates, hospitalization rates, and testing positivity rates. Only the former was available easily in this data and is included here.

All questions can be directed to hunterwyork [at] gmail [dot] com

Total Cases as of 2020-08-17

Total Deaths Attributable to Covid as of 2020-08-17

Total Confirmed Cases of Covid per 1,000 residents as of 2020-08-17

Total Deaths Attributable to Covid per 1,000 residents as of 2020-08-17

Development of New Laboratory-Confirmed Cases Over the Past 2 Months

Error: attempt to use zero-length variable name

Development of New Laboratory-Confirmed Cases/1000 People Over the Past 2 Months

Development of Covid-Attributable Over the Past 2 Months

Development of Covid-Attributable Deaths/1000 People Over the Past 2 Months

LS0tCm91dHB1dDoKICBzbGlkeV9wcmVzZW50YXRpb246IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMgSW50cm9kdWN0aW9uCgpUaGUgZm9sbG93aW5nIHNsaWRlcyB1c2UgZGF0YSBzb3VyY2VkIGZyb20gdGhlIE1pc3Npc3NpcHBpIFN0YXRlIERlcGFydG1lbnQgb2YgSGVhbHRoLiBEYXRhIGFyZSBzeW50aGVzaXplZCBieSBKb2hucyBIb3BraW5zIFVuaXZlcnNpdHkgYW5kIGFyZSBhdmFpbGFibGUgaGVyZTogW2h0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOV0uIENvZGUgdG8gcmVwcm9kdWNlIHRoZXNlIGdyYXBocyBpcyBtYWludGFpbmVkIGhlcmU6IFtodHRwczovL2dpdGh1Yi5jb20vaHVudGVyd3lvcmsvbXNfY292aWRfdml6XS4gVGhlIGNvZGUgY2FuIGVhc2lseSBiZSBhZG9wdGVkIGZvciBhbnkgc3RhdGUuCgpUaGVzZSBzbGlkZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4gVGhlIG1vc3QgcmVjZW50IGRhdGUgb2YgZGF0YSBpcyB2aXNpYmxlIGluIHRoZSB0aXRsZXMgb2Ygc2V2ZXJhbCBzbGlkZXMKCiMjIEludHJvZHVjdGlvbiwgY29udC4KCkFsbCBjYXNlcyBhcmUgYXMgcmVwb3J0ZWQgYnkgdGhlIE1TREguIENhc2VzIGFuZCBjYXNlIHJhdGVzIGRvIG5vdCByZXByZXNlbnQgdGhlIHRydWUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIHRoZSBzdGF0ZS4gUmF0aGVyLCB0aGV5IHJlZmxlY3QgYXZhaWxhYmlsaXR5IG9mIHRlc3RpbmcsIHRlc3RpbmcgdXNhZ2UsIGFuZCBhY3R1YWwgaW5mZWN0aW9uIHJhdGVzLiBCZXR0ZXIgbWV0cmljcyBmb3IgdHJhY2tpbmcgdGhlIHByb2dyZXNzIG9mIHRoZSBwYW5kZW1pYyBpbmNsdWRlIGRlYXRoIHJhdGVzLCBob3NwaXRhbGl6YXRpb24gcmF0ZXMsIGFuZCB0ZXN0aW5nIHBvc2l0aXZpdHkgcmF0ZXMuIE9ubHkgdGhlIGZvcm1lciB3YXMgYXZhaWxhYmxlIGVhc2lseSBpbiB0aGlzIGRhdGEgYW5kIGlzIGluY2x1ZGVkIGhlcmUuIAoKQWxsIHF1ZXN0aW9ucyBjYW4gYmUgZGlyZWN0ZWQgdG8gaHVudGVyd3lvcmsgW2F0XSBnbWFpbCBbZG90XSBjb20KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIikKbGlicmFyeShkcGx5cikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc2YpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZ2dhbmltYXRlKQpsaWJyYXJ5KHRyYW5zZm9ybXIpCmxpYnJhcnkoZ2lmc2tpKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkobWFncml0dHIpCgpmaWxlc19yb290IDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkvbWFzdGVyL2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X2RhaWx5X3JlcG9ydHNfdXMvIgoKYy5zdGF0ZSA8LSAiTWlzc2lzc2lwcGkiCgojIGNyZWF0ZSB0b2RheSB2YXJpYWJsZSBkZXBlbmRlbnQgb24gdGhlIHRpbWUgb2YgZGF5CmlmIChTeXMudGltZSgpICU+JSAKICAgIHN1YnN0cigxMiwgMTMpICU+JSAKICAgIGFzLm51bWVyaWMgPj0gMjApewogIHRvZGF5IDwtICBTeXMuRGF0ZSgpICU+JSBhcy5EYXRlKCktMX0gZWxzZSB7CiAgICB0b2RheSA8LSAgU3lzLkRhdGUoKSAlPiUgYXMuRGF0ZSgpLTIKICB9CgojYmVnaW5uaW5nIGRhdGUgY2FuIGdvIGJhY2sgdG8gQXByaWwgMTIKYmVnaW5uaW5nX2RhdGUgPC0gIjIwMjAtMDYtMDEiICU+JSBhcy5EYXRlKCkKCiMgZG93bmxvYWQgZGVhdGggZGF0YQoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5L21hc3Rlci9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19VUy5jc3YiICU+JQogIHVybCgpICU+JQogIHJlYWRfY3N2KCkgJT4lCiAgZGF0YS50YWJsZSgpIC0+IGRlYXRocwoKZGVhdGhzWywgbWVhc3VyZSA6PSAiZGVhdGhzIl0KCiMgZG93bmxvYWQgY29uZmlybWVkIGNhc2UgZGF0YQoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5L21hc3Rlci9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9VUy5jc3YiICU+JQogIHVybCgpICU+JQogIHJlYWRfY3N2KCkgJT4lCiAgZGF0YS50YWJsZSgpIC0+IGNhc2VzCgpjYXNlc1ssIG1lYXN1cmUgOj0gImNhc2VzIl0KCiMgYXBwZW5kIGFuZCByZXNoYXBlCmNvdW50eV9kYXRhIDwtIHJiaW5kbGlzdChsaXN0KGRlYXRocywgY2FzZXMpLCBmaWxsID0gVCkKY291bnR5X2RhdGFfbG9uZyA8LSBtZWx0KGNvdW50eV9kYXRhW1Byb3ZpbmNlX1N0YXRlID09IGMuc3RhdGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgaWQudmFycyA9IG5hbWVzKGNvdW50eV9kYXRhKVshbmFtZXMoY291bnR5X2RhdGEpICVsaWtlJSAiLyJdICkKCiMgZmlsbCBpbiBwb3AgZm9yIGNhc2VzIGRhdGEgc2luY2UgdGhhdCcgc21pc3NpbmcKY291bnR5X2RhdGFfbG9uZ1ssIFBvcHVsYXRpb24gOj0gbWVhbihQb3B1bGF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgIC4oRklQUywgUHJvdmluY2VfU3RhdGUsIHZhcmlhYmxlKV0KCiMgcmVmb3JtYXQgZGF0ZSB2YXJpYWJsZQpjb3VudHlfZGF0YV9sb25nWywgZGF0ZV9zdGQgOj0gYXMuRGF0ZSh2YXJpYWJsZSxmb3JtYXQ9IiVtLyVkLyV5IildCgojIyBtYWtlIHN1cmUgZGF0YSB2YXJpYWJsZSBpcyBpbiBvcmRlcgpjb3VudHlfZGF0YV9sb25nIDwtIGNvdW50eV9kYXRhX2xvbmdbb3JkZXIoZGF0ZV9zdGQpXQoKIyBNYWtlIGEgbmV3IGNhc2VzLyBuZXcgZGVhdGhzIGluZGljYXRvcgp0ZW1wIDwtIGNvdW50eV9kYXRhX2xvbmdbbWVhc3VyZSAlaW4lIGMoImNhc2VzIiwgImRlYXRocyIpXQp0ZW1wWywgdmFsdWUgOj0gdmFsdWUgLSBsYWcodmFsdWUpLCBieSA9IC4oRklQUywgbWVhc3VyZSldCnRlbXBbLCBtZWFzdXJlIDo9IHBhc3RlMCgibmV3XyIsIG1lYXN1cmUpXQpjb3VudHlfZGF0YV9sb25nIDwtIHJiaW5kKGNvdW50eV9kYXRhX2xvbmcsIHRlbXApCgojIGNyZWF0ZSBjYXNlIGFuZCBkZWF0aCByYXRlcwpyYXRlc19sb25nIDwtIGNvcHkoY291bnR5X2RhdGFfbG9uZykKcmF0ZXNfbG9uZ1ssIHZhbHVlIDo9IHZhbHVlL1BvcHVsYXRpb25dCnJhdGVzX2xvbmdbLCBtZWFzdXJlIDo9IHBhc3RlMChtZWFzdXJlLCAiX3JhdGUiKV0KCiMgYW5kIGFwcGVuZCB0byBkYXRhCmNvdW50eV9kYXRhX2xvbmcgPC0gcmJpbmRsaXN0KGxpc3QoY291bnR5X2RhdGFfbG9uZywgcmF0ZXNfbG9uZykpCgojIHNhdmVSRFMoY291bnR5X2RhdGFfbG9uZywgIkM6L1VzZXJzL2h5b3JrL0Rlc2t0b3AvY292aWRfbWFwcy9jb3VudHlfZGF0YV9sb25nLnJkcyIpCiMgCiMgY291bnR5X2RhdGFfbG9uZyA8LSByZWFkX3JkcygiQzovVXNlcnMvaHlvcmsvRGVza3RvcC9jb3ZpZF9tYXBzL2NvdW50eV9kYXRhX2xvbmcucmRzIikKCgojbm93IGxvYWQgaW4gYSBzaGFwZWZpbGUKc2hwIDwtIGNvdW50aWVzKHN0YXRlID0gc3RyX3N1YihyYXRlc19sb25nWzEsRklQU10sIDEsIC00KSwKICAgICAgICAgICAgICAgIGNiID0gVFJVRSkKCiNzYXZlUkRTKHNocCwgInNocC5yZHMiKQoKCiNzaHAgPC0gcmVhZF9yZHMoIkM6L1VzZXJzL2h5b3JrL0Rlc2t0b3AvY292aWRfbWFwcy9zaHAucmRzIikKCiMgbWVyZ2Ugb250byBjb3VudHkgZGF0YQpzaHAkR0VPSUQgPC0gc2hwJEdFT0lEICU+JSBhcy5udW1lcmljKCkKY291bnR5X2RhdGFfbG9uZ19zaHAgPC0gbWVyZ2UoY291bnR5X2RhdGFfbG9uZywgc2hwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICJGSVBTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5LnkgPSAiR0VPSUQiKSAlPiUgZGF0YS50YWJsZSgpCmBgYAoKIyMgVG90YWwgQ2FzZXMgYXMgb2YgYHIgdG9kYXlgCgpgYGB7ciwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGQUxTRX0KI3ByZXNlcnZlIG1heCB2YWx1ZSBmb3IgcGxvdHRpbmcKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiY2FzZXMiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtYXgoKSAtPiBtYXhfdmFsdWUKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiY2FzZXMiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtaW4oKSAtPiBtaW5fdmFsdWUKCiNjcmVhdGUgc2NhbGUgYnJlYWtzCmMobWluX3ZhbHVlLDEwMCwxMDAwLDMwMDAsbWF4X3ZhbHVlKSAtPiBzY2FsZV9icmVha3MKCiMgcGxvdApnZzEgPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gImNhc2VzIiAmIGRhdGVfc3RkID09IHRvZGF5XSkgKyAKICBnZW9tX3NmKGFlcyhmaWxsID0gdmFsdWUsIGdlb21ldHJ5ID0gZ2VvbWV0cnkpLCBsd2QgPSAuMjUpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6bG9nMTBfdHJhbnMoKSwgYnJlYWtzID0gc2NhbGVfYnJlYWtzLCAKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZV9icmVha3MsCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW5fdmFsdWUsIG1heF92YWx1ZSkpKwogIGxhYnMoZmlsbCA9ICJUb3RhbCBDYXNlcyIsIHg9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMywgImxpbmUiKSkgKwogIGdlb21fc2ZfdGV4dChhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgbGFiZWwgPSB2YWx1ZSksIAogICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIAogICAgICAgICAgICAgICBzaXplID0gMikKcHJpbnQoZ2cxKQoKYGBgCgojIyBUb3RhbCBEZWF0aHMgQXR0cmlidXRhYmxlIHRvIENvdmlkIGFzIG9mIGByIHRvZGF5YAoKYGBge3IsIGVjaG8gPSBGLCBtZXNzYWdlID0gRkFMU0V9CiNwcmVzZXJ2ZSBtYXggdmFsdWUgZm9yIHBsb3R0aW5nCmNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gImRlYXRocyIgJiBkYXRlX3N0ZCA9PSB0b2RheV0kdmFsdWUgJT4lIG1heCgpIC0+IG1heF92YWx1ZQpjb3VudHlfZGF0YV9sb25nX3NocFttZWFzdXJlID09ICJkZWF0aHMiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtaW4oKSAtPiBtaW5fdmFsdWUKCiNjcmVhdGUgc2NhbGUgYnJlYWtzCmMobWluX3ZhbHVlLCAyXigxOjUpLCBtYXhfdmFsdWUpIC0+IHNjYWxlX2JyZWFrcwoKIyBwbG90CmdnMiA8LSBnZ3Bsb3QoY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzIiAmIGRhdGVfc3RkID09IHRvZGF5XSkgKyAKICBnZW9tX3NmKGFlcyhmaWxsID0gdmFsdWUsIGdlb21ldHJ5ID0gZ2VvbWV0cnkpLCBsd2QgPSAuMjUpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBzY2FsZXM6OnBzZXVkb19sb2dfdHJhbnMoc2lnbWEgPSAxLCBiYXNlID0gMiksIGJyZWFrcyA9IHNjYWxlX2JyZWFrcywgCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVfYnJlYWtzLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluX3ZhbHVlLCBtYXhfdmFsdWUpKSsKICBsYWJzKGZpbGwgPSAiVG90YWwgRGVhdGhzIiwgeD0gIiIsIHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgzLCAibGluZSIpKSArCiAgZ2VvbV9zZl90ZXh0KGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBsYWJlbCA9IHZhbHVlKSwgCiAgICAgICAgICAgICAgIGNvbG9yID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIHNpemUgPSAyKQpwcmludChnZzIpCgpgYGAKCiMjIFRvdGFsIENvbmZpcm1lZCBDYXNlcyBvZiBDb3ZpZCBwZXIgMSwwMDAgcmVzaWRlbnRzIGFzIG9mIGByIHRvZGF5YAoKYGBge3IsIGVjaG8gPSBGLCBtZXNzYWdlID0gRkFMU0V9CiNwcmVzZXJ2ZSBtYXggdmFsdWUgZm9yIHBsb3R0aW5nCmNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gImNhc2VzX3JhdGUiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtYXgoKSAtPiBtYXhfdmFsdWUKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiY2FzZXNfcmF0ZSIgJiBkYXRlX3N0ZCA9PSB0b2RheV0kdmFsdWUgJT4lIG1pbigpIC0+IG1pbl92YWx1ZQoKI2NyZWF0ZSBzY2FsZSBicmVha3MKcm91bmQoYyhzZXEoMCwgLjA0LCAuMDA1KSwgbWF4X3ZhbHVlKSoxMDAwLCAzKSAtPiBzY2FsZV9icmVha3MKCiMgcGxvdApnZzQgPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gImNhc2VzX3JhdGUiICYgZGF0ZV9zdGQgPT0gdG9kYXldKSArIAogIGdlb21fc2YoYWVzKGZpbGwgPSB2YWx1ZSoxMDAwLCBnZW9tZXRyeSA9IGdlb21ldHJ5KSwgbHdkID0gLjI1KSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoYnJlYWtzID0gc2NhbGVfYnJlYWtzLAogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gc2NhbGVzOjpwc2V1ZG9fbG9nX3RyYW5zKHNpZ21hID0gLjEsIGJhc2UgPSAoMikpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlX2JyZWFrcywKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbl92YWx1ZSoxMDAwLCBtYXhfdmFsdWUqMTAwMCkpKwogIGxhYnMoZmlsbCA9ICJDYXNlcy8xLDAwMCIsIHg9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMywgImxpbmUiKSkgKwogIGdlb21fc2ZfdGV4dChhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgbGFiZWwgPSByb3VuZCh2YWx1ZSoxMDAwLDIpKSwgCiAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgCiAgICAgICAgICAgICAgIHNpemUgPSAyKQpwcmludChnZzQpCmBgYAoKCgojIyBUb3RhbCBEZWF0aHMgQXR0cmlidXRhYmxlIHRvIENvdmlkIHBlciAxLDAwMCByZXNpZGVudHMgYXMgb2YgYHIgdG9kYXlgCgpgYGB7ciwgZWNobyA9IEYsIG1lc3NhZ2UgPSBGQUxTRX0KI3ByZXNlcnZlIG1heCB2YWx1ZSBmb3IgcGxvdHRpbmcKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtYXgoKSAtPiBtYXhfdmFsdWUKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiICYgZGF0ZV9zdGQgPT0gdG9kYXldJHZhbHVlICU+JSBtaW4oKSAtPiBtaW5fdmFsdWUKCiNjcmVhdGUgc2NhbGUgYnJlYWtzCnJvdW5kKGMoc2VxKDAsIC4wMDIsIC4wMDA1KSwgbWF4X3ZhbHVlKSoxMDAwLCAzKSAtPiBzY2FsZV9icmVha3MKCiMgcGxvdApnZzMgPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gImRlYXRoc19yYXRlIiAmIGRhdGVfc3RkID09IHRvZGF5XSkgKyAKICBnZW9tX3NmKGFlcyhmaWxsID0gdmFsdWUqMTAwMCwgZ2VvbWV0cnkgPSBnZW9tZXRyeSksIGx3ZCA9IC4yNSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJBIiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZV9icmVha3MsCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBzY2FsZXM6OnBzZXVkb19sb2dfdHJhbnMoc2lnbWEgPSAuMSwgYmFzZSA9ICgyKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVfYnJlYWtzLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluX3ZhbHVlKjEwMDAsIG1heF92YWx1ZSoxMDAwKSkrCiAgbGFicyhmaWxsID0gIkRlYXRocy8xLDAwMCIsIHg9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMywgImxpbmUiKSkgKwogIGdlb21fc2ZfdGV4dChhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgbGFiZWwgPSByb3VuZCh2YWx1ZSoxMDAwLDIpKSwgCiAgICAgICAgICAgICAgIGNvbG9yID0gImdyZWVuIiwgCiAgICAgICAgICAgICAgIHNpemUgPSAyKQpwcmludChnZzMpCmBgYAoKIyMgUmVnaW9uYWwgVHJlbmRzOiBJbnRyb2R1Y3Rpb24KCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZBTFNFfQoKCiMjIEFzc2lnbiBub3J0aCwgY2VudHJhbCBhbmQgc291dGhlcm4gTVMgdmFyaWFibGVzCmNvdW50eV9kYXRhX2xvbmcgPC0gY291bnR5X2RhdGFfbG9uZ1tMYXQgIT0gMF0KY291bnR5X2RhdGFfbG9uZ1tMYXQgPD0gbWluKExhdCkgKyAoKG1heChMYXQpIC0gbWluKExhdCkpLzMpICYgTGF0ICE9IDAsIHJlZ2lvbiA6PSAiU291dGgiXQpjb3VudHlfZGF0YV9sb25nW0xhdCA+IG1pbihMYXQpICsgKChtYXgoTGF0KSAtIG1pbihMYXQpKS8zKSAmIExhdCA8PSBtaW4oTGF0KSArICgobWF4KExhdCkgLSBtaW4oTGF0KSkvMS41KSAmIExhdCAhPSAwLCByZWdpb24gOj0gIkNlbnRyYWwgIl0KY291bnR5X2RhdGFfbG9uZ1tMYXQgPiBtaW4oTGF0KSArICgobWF4KExhdCkgLSBtaW4oTGF0KSkvMS41KSAmIExhdCAhPSAwLCByZWdpb24gOj0gIk5vcnRoIl0KCmNvdW50eV9kYXRhX2xvbmdbTG9uZ18gPD0gbWluKExvbmdfKSArICgobWF4KExvbmdfKSAtIG1pbihMb25nXykpLzIpICYgTG9uZ18gIT0gMCwgcmVnaW9uMiA6PSAid2VzdGVybiJdCmNvdW50eV9kYXRhX2xvbmdbTG9uZ18gPiBtaW4oTG9uZ18pICsgKChtYXgoTG9uZ18pIC0gbWluKExvbmdfKSkvMikgJiBMb25nXyAhPSAwLCByZWdpb24yIDo9ICJlYXN0ZXJuIl0KCiNtYXAgY291bnRpZXMgYnkgcmVnaW9uCm1lcmdlKHVuaXF1ZShjb3VudHlfZGF0YV9sb25nWywuKHJlZ2lvbiwgcmVnaW9uMiwgRklQUyldKSAsIHNocCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5LnggPSAiRklQUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS55ID0gIkdFT0lEIikgJT4lIGRhdGEudGFibGUoKSAgLT4gcmVnaW9uc19jb3VudHkKcmVnaW9uc19jb3VudHlbLCByZWdpb25fY2F0IDo9IHBhc3RlMChyZWdpb24sIHJlZ2lvbjIpXQoKZ2dwbG90KHJlZ2lvbnNfY291bnR5KSArIAogIGdlb21fc2YoYWVzKGZpbGwgPSByZWdpb25fY2F0LCBnZW9tZXRyeSA9IGdlb21ldHJ5KSkgKyAKICBsYWJzKHRpdGxlID0gIlJlZ2lvbnMgQXMgRGVmaW5lZCBGb3IgdGhlIFB1cnBvc2VzIG9mIFRoaXMgQW5hbHlzaXMiLAogICAgICAgbGVnZW5kID0gIlJlZ2lvbiIpICsgCiAgdGhlbWVfdm9pZCgpCmBgYAoKIyMgUmVnaW9uYWwgVHJlbmRzIGluIE5ldyBDb3ZpZCBJbmNpZGVudCBDYXNlcy9EYXkKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZBTFNFfQoKI25vdyBtYWtlIGxvZ2dlZCB2YXJpYWJsZXMKZm9yIChsYWdfZGF5IGluIDE6Nil7CiAgY291bnR5X2RhdGFfbG9uZ1ssIHBhc3RlMCgibGFnXyIsIGxhZ19kYXksICJfdmFsdWUiKSA6PSBkYXRhLnRhYmxlOjpzaGlmdCh2YWx1ZSwgbGFnX2RheSwgdHlwZSA9ICJsYWciKSwgYnkgPSAuKEZJUFMsIG1lYXN1cmUpXQp9Cgojbm93IG1ha2Ugd2VpZ2h0ZWQgdmFsdWUgb2YgcGFzdCB3ZWVrCmNvdW50eV9kYXRhX2xvbmdbLCBtZWFuX2xhZ192YWx1ZSA6PSAodmFsdWUgKyBsYWdfMV92YWx1ZSArIGxhZ18yX3ZhbHVlICsgbGFnXzNfdmFsdWUgKyBsYWdfNF92YWx1ZSArIGxhZ181X3ZhbHVlICsgbGFnXzZfdmFsdWUgKS8gNywgYnkgPSAuKEZJUFMsIG1lYXN1cmUsIGRhdGVfc3RkKV0KCiNjb2xsYXBzZSB0byBzdGF0ZSBhbmQgcmVnaW9uCmNvdW50eV9kYXRhX2xvbmdfc3RhdGUgPC0gY291bnR5X2RhdGFfbG9uZ1ssLihtZWFuX2xhZ192YWx1ZSA9IHN1bShtZWFuX2xhZ192YWx1ZSksIHZhbHVlID0gc3VtKHZhbHVlKSwgcG9wdWxhdGlvbiA9IHN1bShQb3B1bGF0aW9uKSksIGJ5ID0uKGRhdGVfc3RkLCBtZWFzdXJlKV0KCmNvdW50eV9kYXRhX2xvbmdfcmVnaW9uIDwtIGNvdW50eV9kYXRhX2xvbmdbLC4obWVhbl9sYWdfdmFsdWUgPSBzdW0obWVhbl9sYWdfdmFsdWUpLCB2YWx1ZSA9IHN1bSh2YWx1ZSksIHBvcHVsYXRpb24gPSBzdW0oUG9wdWxhdGlvbikpLCBieSA9LihkYXRlX3N0ZCwgbWVhc3VyZSwgcmVnaW9uLCByZWdpb24yKV0KCmNvdW50eV9kYXRhX2xvbmdfcmVnaW9uWywgcmVnaW9uX2NhdCA6PSBwYXN0ZTAocmVnaW9uLCAiIiwgcmVnaW9uMildCmNvdW50eV9kYXRhX2xvbmdfcmVnaW9uIDwtIHJiaW5kKGNvdW50eV9kYXRhX2xvbmdfcmVnaW9uLCBjb3VudHlfZGF0YV9sb25nX3N0YXRlLCBmaWxsID0gVCkKY291bnR5X2RhdGFfbG9uZ19yZWdpb25baXMubmEocmVnaW9uX2NhdCksIHJlZ2lvbl9jYXQgOj0gIlN0YXRlIl0KY291bnR5X2RhdGFfbG9uZ19yZWdpb25bcmVnaW9uX2NhdCA9PSAiU3RhdGUiLCBzdGF0ZSA6PSAiU3RhdGUiXQpjb3VudHlfZGF0YV9sb25nX3JlZ2lvbltyZWdpb25fY2F0ICE9ICJTdGF0ZSIsIHN0YXRlIDo9ICJSZWdpb25hbCJdCgpnZ3Bsb3QoY291bnR5X2RhdGFfbG9uZ19yZWdpb25bbWVhc3VyZSA9PSAibmV3X2Nhc2VzIiAmIGRhdGVfc3RkID49ICIyMDIwLTA0LTAxIiAgJiBkYXRlX3N0ZCAlaW4lIGModG9kYXksIHNlcS5EYXRlKGFzLkRhdGUoIjIwMjAtMDQtMDEiKSwgdG9kYXksIDEpKV0pICsgZ2VvbV9saW5lKCBhZXMoeCA9IGRhdGVfc3RkLCB5ID0gbWVhbl9sYWdfdmFsdWUsIGdyb3VwID0gcmVnaW9uX2NhdCwgY29sb3IgPSByZWdpb25fY2F0KSkgKwogICAgICB0aGVtZV9idygpKwogICAgICMgeWxpbSgwLCAwLjA0MioxMDAwKSArIAogICAgICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiTmV3IFJlcG9ydGVkIExhYm9yYXRvcnktQ29uZmlybWVkIENhc2VzL0RheSIsIHRpdGxlID0gIlJlZ2lvbmFsIE92ZXJ2aWV3IG9mIHRoZSBEYWlseSBJbmNpZGVuY2Ugb2YgTmV3IENhc2VzXG5Pbmx5IENvbnNpZGVyaW5nIFJlcG9ydGVkIGFuZCBMYWJvcmF0b3J5LUNvbmZpcm1lZCBDYXNlc1xuQWN0dWFsIENhc2VzIEFyZSBQcmVzdW1lZCB0byBiZSBFeHBvbmVudGlhbGx5IEhpZ2hlciIpKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICAgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY291bnR5X2RhdGFfbG9uZ19yZWdpb25bbWVhc3VyZSA9PSAibmV3X2Nhc2VzIiAmIGRhdGVfc3RkID09IHRvZGF5XSwgYWVzKHggPSBkYXRlX3N0ZCwgeSA9IG1lYW5fbGFnX3ZhbHVlLCBsYWJlbCA9cmVnaW9uX2NhdCwgZ3JvdXAgPSByZWdpb25fY2F0LCBjb2xvciA9IHJlZ2lvbl9jYXQpLCBudWRnZV94ID0gMjUpICsgCiAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSArIDUwKSkrCgogICAgZmFjZXRfd3JhcCh+c3RhdGUsIHNjYWxlcyA9ICJmcmVlX3kiLCBucm93ID0gMikKICAKCgpgYGAKCiMjIFJlZ2lvbmFsIFRyZW5kcyBpbiBDb3ZpZCBEZWF0aHMvRGF5IE92ZXIgVGltZQoKYGBge3J9CmdncGxvdChjb3VudHlfZGF0YV9sb25nX3JlZ2lvblttZWFzdXJlID09ICJuZXdfZGVhdGhzIiAmIGRhdGVfc3RkID49ICIyMDIwLTA0LTAxIiAgJiBkYXRlX3N0ZCAlaW4lIGModG9kYXksIHNlcS5EYXRlKGFzLkRhdGUoIjIwMjAtMDQtMDEiKSwgdG9kYXksIDEpKV0pICsgZ2VvbV9saW5lKCBhZXMoeCA9IGRhdGVfc3RkLCB5ID0gbWVhbl9sYWdfdmFsdWUsIGdyb3VwID0gcmVnaW9uX2NhdCwgY29sb3IgPSByZWdpb25fY2F0KSkgKwogICAgdGhlbWVfYncoKSsKICAgICMgeWxpbSgwLCAwLjA0MioxMDAwKSArIAogICAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkRlYXRocyBQZXIgRGF5IiwgdGl0bGUgPSAiIikrCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNvdW50eV9kYXRhX2xvbmdfcmVnaW9uW21lYXN1cmUgPT0gIm5ld19kZWF0aHMiICYgZGF0ZV9zdGQgPT0gdG9kYXldLCBhZXMoeCA9IGRhdGVfc3RkLCB5ID0gbWVhbl9sYWdfdmFsdWUsIGxhYmVsID1yZWdpb25fY2F0LCBncm91cCA9IHJlZ2lvbl9jYXQsIGNvbG9yID0gcmVnaW9uX2NhdCksIG51ZGdlX3ggPSAyNSkgKwogICAgeGxpbShhcy5EYXRlKCIyMDIwLTA0LTAxIiksIHRvZGF5ICsgNTApKwogICAgZmFjZXRfd3JhcCh+c3RhdGUsIHNjYWxlcyA9ICJmcmVlX3kiLCBucm93ID0gMikgIysgCiAgIyBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYyh0b2RheSwgc2VxLkRhdGUoYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSwgMTApLCByZXAoIiIsIDEwKSksIGJyZWFrcyA9IGModG9kYXksIHNlcS5EYXRlKGFzLkRhdGUoIjIwMjAtMDQtMDEiKSwgdG9kYXkrMTAwLCAxMCkpKQoKYGBgCgpgYGB7cn0KI21ha2Ugc3VyZSB2YXJpYWJsZSBpcyBpbiBvcmRlcgoKbiA8LSAwCmdnX3RyYWpfbGlzdCA8LSBsaXN0KCkKZm9yKGkgaW4gdW5pcXVlKGNvdW50eV9kYXRhX2xvbmckcmVnaW9uKSl7CiAgZm9yKGlpIGluIHVuaXF1ZShjb3VudHlfZGF0YV9sb25nJHJlZ2lvbjIpKXsKICAgIG4gPC0gbiArIDEKICAgIGdnX3RyYWpfbGlzdFtbbl1dIDwtIGdncGxvdChjb3VudHlfZGF0YV9sb25nW21lYXN1cmUgPT0gIm5ld19jYXNlcyIgJiBkYXRlX3N0ZCA+PSAiMjAyMC0wNC0wMSIgJiByZWdpb24gPT0gaSAmIHJlZ2lvbjIgPT0gaWkgJiBkYXRlX3N0ZCAlaW4lIGModG9kYXksIHNlcS5EYXRlKGFzLkRhdGUoIjIwMjAtMDQtMDEiKSwgdG9kYXksIDUpKV0pICsgCiAgICAgIGdlb21fbGluZShhZXMoeCA9IGRhdGVfc3RkLCB5ID0gbWVhbl9sYWdfdmFsdWUsIGdyb3VwID0gQWRtaW4yLCBjb2xvciA9IEFkbWluMikpICsKICAgICAgdGhlbWVfYncoKSsKICAgICAjIHlsaW0oMCwgMC4wNDIqMTAwMCkgKyAKICAgICAgICAgIHhsaW0oYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSArIDUwKSsKICAgICAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIkNvbmZpcm1lZCBDYXNlcyAoNy1kYXkgQXZlcmFnZSkiLCB0aXRsZSA9IHBhc3RlMChpLGlpLCIgIiwgYy5zdGF0ZSkpKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICAgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY291bnR5X2RhdGFfbG9uZ1ttZWFzdXJlID09ICJuZXdfY2FzZXMiICYgZGF0ZV9zdGQgPT0gbWF4KGRhdGVfc3RkKSAmIHJlZ2lvbiA9PSBpICYgcmVnaW9uMiA9PSBpaV0sIGFlcyh4ID0gZGF0ZV9zdGQsIHkgPSBtZWFuX2xhZ192YWx1ZSwgbGFiZWwgPSBBZG1pbjIsIGNvbG9yID0gQWRtaW4yKSwgbnVkZ2VfeCA9IDI1KQogIH0KfQoKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzFdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzJdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzNdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzRdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzVdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzZdXSkKYGBgCgpgYGB7cn0KI21ha2Ugc3VyZSB2YXJpYWJsZSBpcyBpbiBvcmRlcgoKbiA8LSAwCmdnX3RyYWpfbGlzdCA8LSBsaXN0KCkKZm9yKGkgaW4gdW5pcXVlKGNvdW50eV9kYXRhX2xvbmckcmVnaW9uKSl7CiAgZm9yKGlpIGluIHVuaXF1ZShjb3VudHlfZGF0YV9sb25nJHJlZ2lvbjIpKXsKICAgIG4gPC0gbiArIDEKICAgIGdnX3RyYWpfbGlzdFtbbl1dIDwtIGdncGxvdChjb3VudHlfZGF0YV9sb25nW21lYXN1cmUgPT0gIm5ld19jYXNlc19yYXRlIiAmIGRhdGVfc3RkID49ICIyMDIwLTA0LTAxIiAmIHJlZ2lvbiA9PSBpICYgcmVnaW9uMiA9PSBpaSAmIGRhdGVfc3RkICVpbiUgYyh0b2RheSwgc2VxLkRhdGUoYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSwgNSkpXSkgKyAKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gZGF0ZV9zdGQsIHkgPSBtZWFuX2xhZ192YWx1ZSwgZ3JvdXAgPSBBZG1pbjIsIGNvbG9yID0gQWRtaW4yKSkgKwogICAgICB0aGVtZV9idygpKwogICAgICMgeWxpbSgwLCAwLjA0MioxMDAwKSArIAogICAgICAgICAgeGxpbShhcy5EYXRlKCIyMDIwLTA0LTAxIiksIHRvZGF5ICsgNTApKwogICAgICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiQ29uZmlybWVkIENhc2VzLzEsMDAwIFBlb3BsZSAoNy1kYXkgQXZlcmFnZSkiLCB0aXRsZSA9IHBhc3RlMChpLGlpLCIgIiwgYy5zdGF0ZSkpKwogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArCiAgICAgIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY291bnR5X2RhdGFfbG9uZ1ttZWFzdXJlID09ICJuZXdfY2FzZXNfcmF0ZSIgJiBkYXRlX3N0ZCA9PSBtYXgoZGF0ZV9zdGQpICYgcmVnaW9uID09IGkgJiByZWdpb24yID09IGlpXSwgYWVzKHggPSBkYXRlX3N0ZCwgeSA9IG1lYW5fbGFnX3ZhbHVlLCBsYWJlbCA9IEFkbWluMiwgY29sb3IgPSBBZG1pbjIpLCBudWRnZV94ID0gMjUpCiAgfQp9CgpgYGAKCiMjIFJlZ2lvbmFsIENhc2UgUmF0ZSBUcmVuZHMKCmBgYHtyLCBlY2hvID0gRn0KcHJpbnQoZ2dfdHJhal9saXN0W1sxXV0pCmBgYAoKIyMgUmVnaW9uYWwgQ2FzZSBSYXRlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzJdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbM11dKQpgYGAKCiMjIFJlZ2lvbmFsIENhc2UgUmF0ZSBUcmVuZHMKCmBgYHtyLCBlY2hvID0gRn0KcHJpbnQoZ2dfdHJhal9saXN0W1s0XV0pCmBgYAoKIyMgUmVnaW9uYWwgQ2FzZSBSYXRlIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzVdXSkKYGBgCgojIyBSZWdpb25hbCBDYXNlIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbNl1dKQpgYGAKCmBgYHtyfQojbWFrZSBzdXJlIHZhcmlhYmxlIGlzIGluIG9yZGVyCgpuIDwtIDAKZ2dfdHJhal9saXN0IDwtIGxpc3QoKQpmb3IoaSBpbiB1bmlxdWUoY291bnR5X2RhdGFfbG9uZyRyZWdpb24pKXsKICBmb3IoaWkgaW4gdW5pcXVlKGNvdW50eV9kYXRhX2xvbmckcmVnaW9uMikpewogICAgbiA8LSBuICsgMQogICAgZ2dfdHJhal9saXN0W1tuXV0gPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdbbWVhc3VyZSA9PSAiZGVhdGhzIiAmIGRhdGVfc3RkID49ICIyMDIwLTA0LTAxIiAmIHJlZ2lvbiA9PSBpICYgcmVnaW9uMiA9PSBpaSAmIGRhdGVfc3RkICVpbiUgYyh0b2RheSwgc2VxLkRhdGUoYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSwgNSkpXSkgKyAKICAgICAgZ2VvbV9saW5lKGFlcyh4ID0gZGF0ZV9zdGQsIHkgPSB2YWx1ZSwgZ3JvdXAgPSBBZG1pbjIsIGNvbG9yID0gQWRtaW4yKSkgKwogICAgICB0aGVtZV9idygpKwogICAgICMgeWxpbSgwLCAwLjA0MioxMDAwKSArIAogICAgICAgICAgeGxpbShhcy5EYXRlKCIyMDIwLTA0LTAxIiksIHRvZGF5ICsgNTApKwogICAgICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiVG90YWwgQ29uZmlybWVkIERlYXRocyIsIHRpdGxlID0gcGFzdGUwKGksaWksIiAiLCBjLnN0YXRlKSkrCiAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsKICAgICAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjb3VudHlfZGF0YV9sb25nW21lYXN1cmUgPT0gImRlYXRocyIgJiBkYXRlX3N0ZCA9PSBtYXgoZGF0ZV9zdGQpICYgcmVnaW9uID09IGkgJiByZWdpb24yID09IGlpXSwgYWVzKHggPSBkYXRlX3N0ZCwgeSA9IHZhbHVlLCBsYWJlbCA9IEFkbWluMiwgY29sb3IgPSBBZG1pbjIpLCBudWRnZV94ID0gMjUpCiAgfQp9CgpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzFdXSkKYGBgCgojIyBSZWdpb25hbCBEZWF0aCBUcmVuZHMKCmBgYHtyLCBlY2hvID0gRn0KcHJpbnQoZ2dfdHJhal9saXN0W1syXV0pCmBgYAoKIyMgUmVnaW9uYWwgRGVhdGggVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbM11dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFRyZW5kcwoKYGBge3IsIGVjaG8gPSBGfQpwcmludChnZ190cmFqX2xpc3RbWzRdXSkKYGBgCgojIyBSZWdpb25hbCBEZWF0aCBUcmVuZHMKCmBgYHtyLCBlY2hvID0gRn0KcHJpbnQoZ2dfdHJhal9saXN0W1s1XV0pCmBgYAoKIyMgUmVnaW9uYWwgRGVhdGggVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbNl1dKQpgYGAKCmBgYHtyfQojbWFrZSBzdXJlIHZhcmlhYmxlIGlzIGluIG9yZGVyCgpuIDwtIDAKZ2dfdHJhal9saXN0IDwtIGxpc3QoKQpmb3IoaSBpbiB1bmlxdWUoY291bnR5X2RhdGFfbG9uZyRyZWdpb24pKXsKICBmb3IoaWkgaW4gdW5pcXVlKGNvdW50eV9kYXRhX2xvbmckcmVnaW9uMikpewogICAgbiA8LSBuICsgMQogICAgZ2dfdHJhal9saXN0W1tuXV0gPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiICYgZGF0ZV9zdGQgPj0gIjIwMjAtMDQtMDEiICYgcmVnaW9uID09IGkgJiByZWdpb24yID09IGlpICYgZGF0ZV9zdGQgJWluJSBjKHRvZGF5LCBzZXEuRGF0ZShhcy5EYXRlKCIyMDIwLTA0LTAxIiksIHRvZGF5LCA1KSldKSArIAogICAgICBnZW9tX2xpbmUoYWVzKHggPSBkYXRlX3N0ZCwgeSA9IHZhbHVlKjEwMDAsIGdyb3VwID0gQWRtaW4yLCBjb2xvciA9IEFkbWluMikpICsKICAgICAgdGhlbWVfYncoKSsKICAgICAjIHlsaW0oMCwgMC4wNDIqMTAwMCkgKyAKICAgICAgICAgIHhsaW0oYXMuRGF0ZSgiMjAyMC0wNC0wMSIpLCB0b2RheSArIDUwKSsKICAgICAgbGFicyh4ID0gIkRhdGUiLCB5ID0gIlRvdGFsIENvbmZpcm1lZCBEZWF0aHMvMSwwMDAgUGVvcGxlIiwgdGl0bGUgPSBwYXN0ZTAoaSxpaSwiICIsIGMuc3RhdGUpKSsKICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKwogICAgICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNvdW50eV9kYXRhX2xvbmdbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiICYgZGF0ZV9zdGQgPT0gbWF4KGRhdGVfc3RkKSAmIHJlZ2lvbiA9PSBpICYgcmVnaW9uMiA9PSBpaV0sIGFlcyh4ID0gZGF0ZV9zdGQsIHkgPSB2YWx1ZSoxMDAwLCBsYWJlbCA9IEFkbWluMiwgY29sb3IgPSBBZG1pbjIpLCBudWRnZV94ID0gMjUpCiAgfQp9CgpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbMV1dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbMl1dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbM11dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbNF1dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbNV1dKQpgYGAKCiMjIFJlZ2lvbmFsIERlYXRoIFJhdGUgVHJlbmRzCgpgYGB7ciwgZWNobyA9IEZ9CnByaW50KGdnX3RyYWpfbGlzdFtbNl1dKQpgYGAKCiMjIERldmVsb3BtZW50IG9mIE5ldyBMYWJvcmF0b3J5LUNvbmZpcm1lZCBDYXNlcyBPdmVyIHRoZSBQYXN0IDIgTW9udGhzCgpgYGB7cixlY2hvID0gRiwgbWVzc2FnZSA9IEZBTFNFfQpjb3VudHlfZGF0YV9sb25nX3NocCA8LSBtZXJnZShjb3VudHlfZGF0YV9sb25nLCBzaHAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS54ID0gIkZJUFMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueSA9ICJHRU9JRCIpICU+JSBkYXRhLnRhYmxlKCkKCiNwcmVzZXJ2ZSBtYXggdmFsdWUgZm9yIHBsb3R0aW5nCmNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gIm5ld19jYXNlcyJdJG1lYW5fbGFnX3ZhbHVlICU+JSBtYXgoKSAtPiBtYXhfdmFsdWUKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAibmV3X2Nhc2VzIl0kbWVhbl9sYWdfdmFsdWUgJT4lIG1pbigpIC0+IG1pbl92YWx1ZQoKIyBwbG90CmdnMWFuaW0gPC0gZ2dwbG90KGNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gIm5ld19jYXNlcyIgJiBkYXRlX3N0ZCAlaW4lIHNlcS5EYXRlKHRvZGF5LTYwLHRvZGF5LCAzKSBdKSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IG1lYW5fbGFnX3ZhbHVlLCBnZW9tZXRyeSA9IGdlb21ldHJ5KSwgbHdkID0gLjI1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6cHNldWRvX2xvZ190cmFucygpLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluX3ZhbHVlLCBtYXhfdmFsdWUpKSsKICBsYWJzKGZpbGwgPSAiNy1EYXkgQXZlcmFnZSBMYWJvcmF0b3J5LUNvbmZpcm1lZCBDYXNlcy9EYXkiLCB4PSAiIiwgeSA9ICIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDMsICJsaW5lIikpICsKICBnZW9tX3NmX3RleHQoYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGxhYmVsID0gcm91bmQobWVhbl9sYWdfdmFsdWUpKSwKICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICBzaXplID0gMikgKwogIGxhYnModGl0bGUgPSAnRGF0ZToge2Nsb3Nlc3Rfc3RhdGV9JykrCiAgdHJhbnNpdGlvbl9zdGF0ZXMoZGF0ZV9zdGQsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSAwLAogICAgICAgICAgICAgICAgICAgIHN0YXRlX2xlbmd0aCA9IDEpIAphbmltYXRlKGdnMWFuaW0sIGVuZF9wYXVzZSA9IDIwLCBkdXJhdGlvbiA9IDIwKQoKCmBgYAoKCiMjIERldmVsb3BtZW50IG9mIE5ldyBMYWJvcmF0b3J5LUNvbmZpcm1lZCBDYXNlcy8xMDAwIFBlb3BsZSBPdmVyIHRoZSBQYXN0IDIgTW9udGhzCgpgYGB7cixlY2hvID0gRiwgbWVzc2FnZSA9IEZBTFNFfQpjb3VudHlfZGF0YV9sb25nX3NocCA8LSBtZXJnZShjb3VudHlfZGF0YV9sb25nLCBzaHAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS54ID0gIkZJUFMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueSA9ICJHRU9JRCIpICU+JSBkYXRhLnRhYmxlKCkKCiNwcmVzZXJ2ZSBtYXggdmFsdWUgZm9yIHBsb3R0aW5nCmNvdW50eV9kYXRhX2xvbmdfc2hwW21lYXN1cmUgPT0gIm5ld19jYXNlc19yYXRlIl0kbWVhbl9sYWdfdmFsdWUgJT4lIG1heCguLCBuYS5ybSA9IFQpIC0+IG1heF92YWx1ZQpjb3VudHlfZGF0YV9sb25nX3NocFttZWFzdXJlID09ICJuZXdfY2FzZXNfcmF0ZSJdJG1lYW5fbGFnX3ZhbHVlICU+JSBtaW4oLiwgbmEucm0gPSBUKSAtPiBtaW5fdmFsdWUKbWluX3ZhbHVlIDwtIG1pbl92YWx1ZSAqIDEwMDAKbWF4X3ZhbHVlIDwtIG1heF92YWx1ZSAqIDEwMDAKCiMgcGxvdApnZzFhbmltIDwtIGdncGxvdChjb3VudHlfZGF0YV9sb25nX3NocFttZWFzdXJlID09ICJuZXdfY2FzZXNfcmF0ZSIgJiBkYXRlX3N0ZCAlaW4lIHNlcS5EYXRlKHRvZGF5LTYwLHRvZGF5LCAzKSBdKSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IG1lYW5fbGFnX3ZhbHVlKjEwMDAsIGdlb21ldHJ5ID0gZ2VvbWV0cnkpLCBsd2QgPSAuMjUpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKHRyYW5zID0gc2NhbGVzOjpwc2V1ZG9fbG9nX3RyYW5zKCksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW5fdmFsdWUsIG1heF92YWx1ZSkpKwogIGxhYnMoZmlsbCA9ICI3LURheSBBdmVyYWdlIExhYm9yYXRvcnktQ29uZmlybWVkIENhc2VzL0RheS8xMDAwIFBlb3BsZSIsIHg9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMywgImxpbmUiKSkgKwogIGdlb21fc2ZfdGV4dChhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgbGFiZWwgPSByb3VuZChtZWFuX2xhZ192YWx1ZSoxMDAwLDMpKSwKICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICBzaXplID0gMikgKwogIGxhYnModGl0bGUgPSAnRGF0ZToge2Nsb3Nlc3Rfc3RhdGV9JykrCiAgdHJhbnNpdGlvbl9zdGF0ZXMoZGF0ZV9zdGQsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSAwLAogICAgICAgICAgICAgICAgICAgIHN0YXRlX2xlbmd0aCA9IDEpIAphbmltYXRlKGdnMWFuaW0sIGVuZF9wYXVzZSA9IDIwLCBkdXJhdGlvbiA9IDIwKQoKCmBgYAoKIyMgRGV2ZWxvcG1lbnQgb2YgQ292aWQtQXR0cmlidXRhYmxlIE92ZXIgdGhlIFBhc3QgMiBNb250aHMKCmBgYHtyLGVjaG8gPSBGLCBtZXNzYWdlID0gRkFMU0V9CmNvdW50eV9kYXRhX2xvbmdfc2hwIDwtIG1lcmdlKGNvdW50eV9kYXRhX2xvbmcsIHNocCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5LnggPSAiRklQUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS55ID0gIkdFT0lEIikgJT4lIGRhdGEudGFibGUoKQoKI3ByZXNlcnZlIG1heCB2YWx1ZSBmb3IgcGxvdHRpbmcKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzIl0kdmFsdWUgJT4lIG1heCgpIC0+IG1heF92YWx1ZQpjb3VudHlfZGF0YV9sb25nX3NocFttZWFzdXJlID09ICJkZWF0aHMiXSR2YWx1ZSAlPiUgbWluKCkgLT4gbWluX3ZhbHVlCgojIHBsb3QKZ2cxYW5pbSA8LSBnZ3Bsb3QoY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzIiAmIGRhdGVfc3RkICVpbiUgc2VxLkRhdGUodG9kYXktNjAsdG9kYXksIDMpIF0pICsKICBnZW9tX3NmKGFlcyhmaWxsID0gbWVhbl9sYWdfdmFsdWUsIGdlb21ldHJ5ID0gZ2VvbWV0cnkpLCBsd2QgPSAuMjUpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKHRyYW5zID0gc2NhbGVzOjpwc2V1ZG9fbG9nX3RyYW5zKCksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW5fdmFsdWUsIG1heF92YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIkEiKSsKICBsYWJzKGZpbGwgPSAiQ3VtdWxhdGl2ZSBEZWF0aHMiLCB4PSAiIiwgeSA9ICIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDMsICJsaW5lIikpICsKICBnZW9tX3NmX3RleHQoYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGxhYmVsID0gcm91bmQobWVhbl9sYWdfdmFsdWUpKSwKICAgICAgICAgICAgICAgY29sb3IgPSAiZ3JlZW4iLAogICAgICAgICAgICAgICBzaXplID0gMikgKwogIGxhYnModGl0bGUgPSAnRGF0ZToge2Nsb3Nlc3Rfc3RhdGV9JykrCiAgdHJhbnNpdGlvbl9zdGF0ZXMoZGF0ZV9zdGQsCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSAwLAogICAgICAgICAgICAgICAgICAgIHN0YXRlX2xlbmd0aCA9IDEpIAphbmltYXRlKGdnMWFuaW0sIGVuZF9wYXVzZSA9IDIwLCBkdXJhdGlvbiA9IDIwKQoKCmBgYAoKCiMjIERldmVsb3BtZW50IG9mIENvdmlkLUF0dHJpYnV0YWJsZSBEZWF0aHMvMTAwMCBQZW9wbGUgT3ZlciB0aGUgUGFzdCAyIE1vbnRocwoKYGBge3IsZWNobyA9IEYsIG1lc3NhZ2UgPSBGQUxTRX0KY291bnR5X2RhdGFfbG9uZ19zaHAgPC0gbWVyZ2UoY291bnR5X2RhdGFfbG9uZywgc2hwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueCA9ICJGSVBTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5LnkgPSAiR0VPSUQiKSAlPiUgZGF0YS50YWJsZSgpCgojcHJlc2VydmUgbWF4IHZhbHVlIGZvciBwbG90dGluZwpjb3VudHlfZGF0YV9sb25nX3NocFttZWFzdXJlID09ICJkZWF0aHNfcmF0ZSJdJHZhbHVlICU+JSBtYXgoLiwgbmEucm0gPSBUKSAtPiBtYXhfdmFsdWUKY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiXSR2YWx1ZSAlPiUgbWluKC4sIG5hLnJtID0gVCkgLT4gbWluX3ZhbHVlCm1pbl92YWx1ZSA8LSBtaW5fdmFsdWUgKiAxMDAwCm1heF92YWx1ZSA8LSBtYXhfdmFsdWUgKiAxMDAwCgojIHBsb3QKZ2cxYW5pbSA8LSBnZ3Bsb3QoY291bnR5X2RhdGFfbG9uZ19zaHBbbWVhc3VyZSA9PSAiZGVhdGhzX3JhdGUiICYgZGF0ZV9zdGQgJWluJSBzZXEuRGF0ZSh0b2RheS02MCx0b2RheSwgMykgXSkgKwogIGdlb21fc2YoYWVzKGZpbGwgPSBtZWFuX2xhZ192YWx1ZSoxMDAwLCBnZW9tZXRyeSA9IGdlb21ldHJ5KSwgbHdkID0gLjI1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6cHNldWRvX2xvZ190cmFucygpLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluX3ZhbHVlLCBtYXhfdmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJBIikrCiAgbGFicyhmaWxsID0gIkN1bXVsYXRpdmUgRGVhdGhzLzEwMDAgUGVvcGxlIiwgeD0gIiIsIHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgzLCAibGluZSIpKSArCiAgZ2VvbV9zZl90ZXh0KGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBsYWJlbCA9IHJvdW5kKG1lYW5fbGFnX3ZhbHVlKjEwMDAsMykpLAogICAgICAgICAgICAgICBjb2xvciA9ICJncmVlbiIsCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICdEYXRlOiB7Y2xvc2VzdF9zdGF0ZX0nKSsKICB0cmFuc2l0aW9uX3N0YXRlcyhkYXRlX3N0ZCwKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX2xlbmd0aCA9IDAsCiAgICAgICAgICAgICAgICAgICAgc3RhdGVfbGVuZ3RoID0gMSkgCmFuaW1hdGUoZ2cxYW5pbSwgZW5kX3BhdXNlID0gMjAsIGR1cmF0aW9uID0gMjApCgoKYGBgCg==